Skip to main content

Arquitetura do Banco de Dados

Introdução

  O contexto do nosso projeto envolve a manipulação de dados para treinar modelos capazes de classificar rachaduras em imagens de superfícies de edifícios e, uma vez alcançado um resultado satisfatório, aplicar essa classificação automática em produção. Além disso, desenvolvemos uma interface web acessível apenas a usuários cadastrados, onde serão exibidas todas as informações coletadas durante as expedições realizadas pela equipe do IPT.

  Por isso, é fundamental contarmos com uma estrutura de armazenamento eficiente para registrar e consultar esses dados. Para atender a essa necessidade, optamos por um banco de dados relacional. Um sistema de gestão que organiza informações em tabelas compostas por linhas, que representam registros, e colunas, que definem atributos desses registros. As tabelas podem se relacionar por meio de chaves primárias e estrangeiras, o que facilita a recuperação de dados relacionados e garante a integridade referencial e a consistência das informações.

Arquitetura

  A seguir, apresentamos o diagrama do nosso banco de dados e uma explicação detalhada de cada tabela e seus relacionamentos.

Figura 1 - Banco de Dados

Banco de Dados

Fonte: Os autores (2025)

 A estrutura do nosso banco de dados baseia-se em chaves primárias e chaves estrangeiras. A chave primária é um campo (ou conjunto de campos) que identifica de forma única cada registro em uma tabela, impedindo duplicatas; aqui, todas as nossas tabelas possuem um atributo chamado “id” como chave primária. Já a chave estrangeira é um campo que referencia a chave primária de outra tabela, criando vínculos entre os dados e garantindo a integridade referencial; no nosso projeto, elas seguem o padrão “id_(nome_da_tabela_referenciada)".

User

LinhasDescriçãoTipo
idIdentificador único de cada usuárioChave primaria
emailEndereço de e-mail usado para autenticaçãoString
nome_completoNome completo do usuário para exibição e identificaçãoString
senhaSenha de acesso (armazenada de forma segura/criptografada)String
cargoFunção ou perfil de acesso do usuário dentro da aplicaçãoString

Expedition

LinhasDescriçãoTipo
idIdentificador único de cada expediçãoChave primaria
nomeNome atribuído à expediçãoString
localizaçãoLocalidade onde a expedição foi realizadaString
data_criacaoData em que o registro da expedição foi criadoDate
ultima_attData da última atualização feita no registro da expediçãoDate
id_responsavelIdentificador do usuário responsável pela expedição; referência a user.idChave estrangeira
descricaoTexto descritivo detalhando o propósito e atividades da expediçãoString
foto_capaURL da imagem utilizado como foto de capaString

Building

LinhasDescriçãoTipo
idIdentificador único de cada edifícioChave primaria
id_expedicaoIdentificador da expedição à qual o edifício pertence; referência a expedition.idChave estrangeira
nomeNome do edifícioString
complementoInformação adicional do endereço ou referência complementarString
descricaoDescrição detalhada do edifício, como características e finalidadeString
foto_fachadaURL da imagem da fachada do edifícioString

Image

LinhasDescriçãoTipo
idIdentificador único de cada registro de imagemChave primaria
urlURL onde a imagem original está armazenadaString
nomeNome do arquivo de imagemString
hora_coletaDateTime em que a imagem foi coletadaDateTime
orientacaoOrientação cardeais da fachada do edificio na qual a imagem se no momento da capturaString
id_predioIdentificador do prédio ao qual a imagem pertence; referência a building.idChave estrangeira
img_resultadoURL da imagem gerada pelo processamento do modelo de visão computacionalString
anotacaoMarcação da região da imagem que se contram as fissurasString
id_modeloIdentificador do modelo utilizado na análise; referência a model.idChave estrangeira

Fissure

LinhasDescriçãoTipo
idIdentificador único de cada fissuraChave primaria
confiabilidadeGrau de confiança na detecção ou classificação da fissura (por exemplo, percentual de acurácia)Integer
categoriaClassificação da fissura conforme seu tipoString
id_imageIdentificador da imagem à qual a fissura pertence; referência a image.idChave estrangeira

Model

LinhasDescriçãoTipo
idIdentificador único de cada modeloChave primária
urlReferência à localização do arquivo do modelo em storageString
nomeNome de identificação do modeloString
tipoCategoria do modeloString
lossValor da função de perda (loss) obtido ao final do treinamentoInteger
loss_tipoNome da função de perda utilizada no treinamento (por exemplo, “cross_entropy”, “MSE”)String

Versionamento

  Como usamos Flask e SQLAlchemy, optamos por Alembic para controlar o versionamento do esquema de banco de dados de forma integrada.

  O versionamento de banco de dados é o controle sistemático das alterações no esquema (tabelas, colunas, constraints) ao longo do tempo. Isso garante rastreabilidade, reversibilidade e consistência entre ambientes (desenvolvimento, teste, produção).

Usando Alembic

OBS: A configuração e manipulação do Alembic deve ser feito dentro da pasta back-end

  1. Instalar
pip install alembic
  1. Inicializar (uma vez)
alembic init alembic 

Cria alembic.ini, pasta alembic/versions/ e env.py.

  1. Configurar

    • Em alembic.ini, ajuste sqlalchemy.url com sua string de conexão.

    Exemplo:

    sqlalchemy.url = postgresql+psycopg2://meu_usuario:minha_senha@meu_host:5432/meu_banco
    • Em alembic/env.py, importe db.metadata (do Flask-SQLAlchemy) e atribua a target_metadata.

    Exemplo:

    from config.database import db
  2. Gerar uma migration

Após alterar seus models, rode:

alembic revision --autogenerate -m "descrição da mudança"
  1. Aplicar migrations

Para atualizar o banco até a última versão:

alembic upgrade head
  1. Reverter

Para voltar uma versão:

alembic downgrade -1

Conclusão

  Em resumo, nossa base relacional sustenta todo o fluxo do projeto: desde o armazenamento organizado das imagens e metadados usados no treinamento e classificação automática de fissuras até o registro detalhado das expedições do IPT na interface web. Com chaves primárias garantindo unicidade e chaves estrangeiras mantendo os vínculos entre entidades, temos um sistema consistente, confiável e preparado para evoluir conforme novas necessidades do projeto.